﻿/**
 * 主窗口类的构造方法。
 */
function MainWindow() {
    var mGame = null                                                            // 游戏
    const mLabelLevel = document.getElementById("IDC_LABEL_LEVEL")              // "关卡数"标签
    const mLabelMoveCount = document.getElementById("IDC_LABEL_MOVE_COUNT")     // "移动次数"标签

    // 设置文档标题
    document.title = IDS_APP_NAME[LANG]

    // 添加按键事件的响应方法
    document.onkeydown = onKeyPressed

    // 添加小人移动事件的响应方法
    document.addEventListener(Const.UM_MAN_MOVED, onManMoved)

    // 添加进入关卡事件的响应方法
    document.addEventListener(Const.UM_GOTO_LEVEL, onGotoLevel)

    // 添加游戏结束事件的响应方法
    document.addEventListener(Const.UM_GAME_OVER, onGameOver)

    // 设置"游戏"菜单
    document.getElementById("IDC_MENU_GAME").innerHTML = IDS_GAME[LANG]

    // 设置"重玩本关"菜单项
    const menuItemRestart = document.getElementById("IDC_MENU_ITEM_RESTART")
    menuItemRestart.innerHTML = IDS_RESTART[LANG]
    menuItemRestart.onclick = onMenuItemRestartClicked

    // 设置"选关"菜单项
    const menuItemSelectLevel = document.getElementById("IDC_MENU_ITEM_SELECT_LEVEL")
    menuItemSelectLevel.innerHTML = IDS_SELECT_LEVEL[LANG]
    menuItemSelectLevel.onclick = onMenuItemSelectLevelClicked

    // 设置"回退"菜单项
    const menuItemUndo = document.getElementById("IDC_MENU_ITEM_UNDO")
    menuItemUndo.innerHTML = IDS_UNDO[LANG]
    menuItemUndo.onclick = onMenuItemUndoClicked

    // 创建游戏区域
    const gameBoard = new GameBoard("IDC_GAME_BOARD")

    // 创建游戏
    mGame = new Game(gameBoard.getDrawer(), gameBoard)

    /**
     * 游戏结束事件的响应方法。
     * @param e 事件相关信息
     */
    function onGameOver(e) {
        if (e.arg1) {
            window.alert(IDS_WON_ALL_OVER[LANG])
        } else {
            window.alert(IDS_WON[LANG])
        }
    }

    /**
     * 进入关卡事件的响应方法。
     * @param e 事件相关信息
     */
    function onGotoLevel(e) {
        const level = IDS_LEVEL[LANG]
        mLabelLevel.innerHTML = level.replace("%s", e.arg1)
        const moveCount = IDS_MOVE_COUNT[LANG]
        mLabelMoveCount.innerHTML = moveCount.replace("%s", 0)
    }

    /**
     * 按键事件的响应方法。
     * @param e 事件相关信息
     */
    function onKeyPressed(e) {
        mGame.onKeyPressed(e.keyCode)
    }

    /**
     * 小人移动事件的响应方法。
     * @param e 事件相关信息
     */
    function onManMoved(e) {
        const moveCount = IDS_MOVE_COUNT[LANG]
        mLabelMoveCount.innerHTML = moveCount.replace("%s", e.arg1)
    }

    /**
     * "重玩本关"菜单项的单击响应方法。
     */
    function onMenuItemRestartClicked() {
        mGame.restart()
    }

    /**
     * "选关"菜单项的单击响应方法。
     */
    function onMenuItemSelectLevelClicked() {
        // 显示输入窗口
        var tipText = IDS_PLEASE_INPUT_NUMBER[LANG]
        tipText = tipText.replace("%s", Const.LEVEL_COUNT)
        const level = InputBox.getIntValue(mGame.getLevel(), Const.LEVEL_COUNT, 1, tipText)

        // 进入关卡
        if (level != mGame.getLevel()) {
            mGame.gotoLevel(level)
        }
    }

    /**
     * "回退"菜单项的单击响应方法。
     */
    function onMenuItemUndoClicked() {
        mGame.undo()
    }
}
